public class MyQueue {
    static class ListNode{
        public int val;
        public ListNode next;//双向链表后继节点
        public ListNode prev;//双向链表前驱节点
        public ListNode(int val){
            this.val=val;
        }
    }
    public ListNode first;//队头
    public ListNode last;//队尾
    public int usedSize;
    //入队(尾插法)
    public void offer(int val){
        ListNode node=new ListNode(val);
        if(first==null){
            first=last=node;
            usedSize++;
            return;
        }
        last.next=node;
        node.prev=last;
        last=node;
        usedSize++;
    }
    //出队
    public void poll(){
        if(first==null){//如果队列为空，直接返回
            return;
        }
        first=first.next;
        if(first==null){//队列中只有一个元素----链表中只有一个节点---直接删除
            last=null;
        }else{//队列中有多个元素---链表中有多个节点----将第一个节点删除
            first.prev=null;
        }
        usedSize--;
    }
    // 获取队头元素---获取链表中第一个节点的值域
    public int peek(){
        if(first==null){
            return -1;
        }
        return first.val;
    }
    //获取队列长度
    public int size(){
        return usedSize;
    }
    //判断队列是否为空
    public boolean isEmpty(){
        return usedSize==0;
    }
}
